from rest_framework import serializers

from review.models import Student, Classes


# class StudentSerializer(serializers.Serializer):
#     id = serializers.IntegerField(label='ID',read_only=True)
#     name = serializers.CharField(label='姓名',max_length=10)
#     sex = serializers.IntegerField(label='性别',required=False)
#     age = serializers.IntegerField(label='年龄',required=False)
#     create_time = serializers.DateTimeField(label='创建时间',read_only=True,required=False)
#     update_time = serializers.DateTimeField(label='更新时间',read_only=True,required=False)
#     # is_delete = serializers.BooleanField(label='逻辑删除', default=False)
#
#     def create(self, validated_data):
#         """
#         重写create方法
#         :param validated_data:前端传来的字典数据用字典不定长传递  再说模型类的create方法接受的数据也是用字典不定长来接收
#         :return:
#         """
#         return Student.objects.create(**validated_data)
#
#     def update(self, instance, validated_data):
#         """
#         修改学生数据
#         将模型中的数据替换成前端传来的数据
#         :param instance: 是views传来的student查询集
#         :param validated_data: 前端传来的字典数据
#         :return:
#         """
#         instance.name = validated_data.get('name', instance.name)
#         instance.age = validated_data.get('age', instance.age)
#         instance.sex = validated_data.get('sex',instance.sex)
#         instance.save()
#         return instance

class StudentSerializer(serializers.ModelSerializer):
    # 新加字段给前端页面 source传递的是这个字段信息是从哪里得到的(也是通过模型找)
    # 因为这里是新增的模型中没有定义这个字段所以只能给用户读不能给用户进行修改 read_only表示是否给用户只读
    # 注意 注意 这里要确定在那个序列化器中添加字段
    # ***(谁的视图集需要返回给前端额外得数据就在用到得序列化器中进行添加)***
    class_name = serializers.CharField(source='classes.name', read_only=True)
    class Meta:
        model = Student
        exclude=['is_delete']
        # 额外的数据校验 或 数据行为(只读/只写)
        extra_kwargs = {
            'age':{
                'min_value':1,
                'max_value':120,
            },
            'classes':{
                'write_only':True,
            }
        }

    # def validate_name(self, value):
    #     """
    #     属性级别的校验会自动将name属性传入到value中
    #     :param value:
    #     :return:
    #     """
    #     if 'DRF' not in value:
    #         raise serializers.ValidationError('用户名称需要包含DRF')
    #     return value

    def validate(self, attrs):
        """
        对象级别校验
        :param attrs: attrs保存的是前端传来的字典json数据
        :return:
        """
        if attrs.get('age')<18:
            raise serializers.ValidationError('未成年禁止是使用')

        return attrs

class StudentSerializerSimple(serializers.ModelSerializer):
    """
    作为一个中间商
    我的商品来源还是Student但是我买的东西只有'name','sex','age'
    """
    class Meta:
        model = Student
        fields = ['name','sex','age']

class ClassesSerializer(serializers.ModelSerializer):
    student_set = StudentSerializerSimple(many=True,read_only=True)
    class Meta:
        model = Classes
        exclude=['is_delete']
        extra_kwargs = {
            'slogan':{
                'min_length':3,
                'max_length':20,
            }
        }


